package com.vvv.designpattern.synchronizedpattern;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author vvv
 * @date 2023-10-18 08 52
 * discription
 */
public class Balking {
    public static void main(String[] args) {

    }
    private Thread t1;

    private volatile boolean stop = false;

    private volatile boolean isStart = false;

    public void start() {
        // 这里出现了指令交错的情况(又读又写），所以要用synchronized来保证原子性
        synchronized (this) {
            if (isStart) {
                return;
            }
            isStart = true;
        }
        t1 = new Thread(() -> {
            while (true) {
                Thread currentThread = Thread.currentThread();
                if (stop) {
                    System.out.println("t1 料理后事");
                    break;
                }
                try {
                    // 这里线程在阻塞中，也可以会被interrupt
                    Thread.sleep(1000);
                    // 这里线程在工作中，可能会被interrupt
                    System.out.println("t1 监控中...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 在阻塞状态中重新设置interrupt状态为true
                }
            }
            // 因为这里不在synchronized里面，为了保证其他线程的可见性所以isStart要用volatile修饰
            // 这里就输入一个线程写，多个线程读的情况
            isStart = false;
        }, "t1");
        t1.start();
    }

    public void stop() {
        stop = true;
        t1.interrupt();
    }
}
